/*
 * 理解用class定义的类与用function定义的对象之间的关系
 * (1)、用class定义类是一种语法糖，本质上还是相当于用function定义了一个"对象"
 * (2)、在class中用constructor声明的构造函数与用function声明的构造函数相同
 * (3)、定义实例字段(实例属性)都可以在构造函数中通过 "this." 来实现
 * (4)、在类中声明的实例方法会被定义到相应对象的原型上
 */

// 用class定义类
class Ox {
    constructor(name){
        console.log( '执行Ox类的构造函数' );
        this.name = name ;
    }
    eat(food){
        console.log( this.name + '吃' + food );
    }
}

// 上面的类采用function方式来实现就是:
// function Ox(name){
//     this.name= name 
// }
// Ox.prototype.eat = function(food) { }

// 通过原型为类扩展属性和方法
Ox.prototype.school = '大肥牛学校' ;
Ox.prototype.fly = function(){
    console.log( '通过在' + this.school +'的学习，'+ this.name + '终于可以腾云驾雾了' );
}

// 创建类的实例
let x = new Ox( '牛魔王' );
console.log( x ); // 在 x 指向的实例中只有 name 字段，没有 eat 方法
x.eat( '三秦套餐' ); // 调用实例方法
x.fly();

console.log( '- - - - - - - - - - - - - - - - - - ' );

// 用function定义对象(同时也定义了构造函数)
function Bull(name){
    if( new.target != undefined ){
        console.log( '以构造函数形式执行Bull函数' );
        this.name = name ;
    }
}

Bull.prototype.school = '小肥牛学院' ;

Bull.prototype.eat = function(food){
    console.log( this.name + '吃' + food );
}

Bull.prototype.fly = function(){
    console.log( '通过在' + this.school +'的学习，'+ this.name + '终于飞起来了' );
}

let b = new Bull( '牛魔王' );
console.log( b );
b.eat( '牛肉拉面' );
b.fly();

let u = new Bull( '红孩儿' );
console.log( u );
u.eat( '红烧排骨' );
u.fly();